From a41ba620b12f2248bb191846dab5f445e7cbd11c Mon Sep 17 00:00:00 2001 From: "kfraser@localhost.localdomain" Date: Mon, 27 Nov 2006 12:00:01 +0000 Subject: [PATCH] [HVM] Move IOAPIC ID back to 0x00. Shift LAPIC IDs to 0x01 upwards. Actually the conflict between LAPIC ID 0x00 and IOAPIC ID 0x00 really doesn't matter even in a native system but we can avoid any risk of a warning by shifting the LAPIC ID space by one. Also the changeset fixes construction of the MADT (LAPIC info was overwriting the IOAPIC info) so we can now boot with ACPI MADT again. Signed-off-by: Keir Fraser --- tools/firmware/hvmloader/acpi/build.c | 5 ++--- tools/firmware/hvmloader/config.h | 2 +- tools/firmware/hvmloader/mp_tables.c | 2 +- xen/arch/x86/hvm/vlapic.c | 4 ++-- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/tools/firmware/hvmloader/acpi/build.c b/tools/firmware/hvmloader/acpi/build.c index 84ae2c96e0..8d067fdaed 100644 --- a/tools/firmware/hvmloader/acpi/build.c +++ b/tools/firmware/hvmloader/acpi/build.c @@ -88,14 +88,13 @@ int construct_madt(struct acpi_20_madt *madt) io_apic->ioapic_addr = IOAPIC_BASE_ADDRESS; offset += sizeof(*io_apic); - lapic = (struct acpi_20_madt_lapic *)io_apic; + lapic = (struct acpi_20_madt_lapic *)(io_apic + 1); for ( i = 0; i < get_vcpu_nr(); i++ ) { memset(lapic, 0, sizeof(*lapic)); lapic->type = ACPI_PROCESSOR_LOCAL_APIC; lapic->length = sizeof(*lapic); - lapic->acpi_processor_id = i; - lapic->apic_id = i; + lapic->acpi_processor_id = lapic->apic_id = i + 1; lapic->flags = ACPI_LOCAL_APIC_ENABLED; offset += sizeof(*lapic); lapic++; diff --git a/tools/firmware/hvmloader/config.h b/tools/firmware/hvmloader/config.h index b25a97236d..18d906c4eb 100644 --- a/tools/firmware/hvmloader/config.h +++ b/tools/firmware/hvmloader/config.h @@ -2,7 +2,7 @@ #define __HVMLOADER_CONFIG_H__ #define IOAPIC_BASE_ADDRESS 0xfec00000 -#define IOAPIC_ID 0xfe +#define IOAPIC_ID 0x00 #define IOAPIC_VERSION 0x11 #define LAPIC_BASE_ADDRESS 0xfee00000 diff --git a/tools/firmware/hvmloader/mp_tables.c b/tools/firmware/hvmloader/mp_tables.c index 2c0f7b52c2..9a1238e51a 100644 --- a/tools/firmware/hvmloader/mp_tables.c +++ b/tools/firmware/hvmloader/mp_tables.c @@ -223,7 +223,7 @@ void fill_mp_config_table(struct mp_config_table *mpct, int length) void fill_mp_proc_entry(struct mp_proc_entry *mppe, int vcpu_id) { mppe->type = ENTRY_TYPE_PROCESSOR; - mppe->lapic_id = vcpu_id; + mppe->lapic_id = vcpu_id + 1; mppe->lapic_version = 0x11; mppe->cpu_flags = CPU_FLAG_ENABLED; if ( vcpu_id == 0 ) diff --git a/xen/arch/x86/hvm/vlapic.c b/xen/arch/x86/hvm/vlapic.c index 00b87ade41..1c6bef005e 100644 --- a/xen/arch/x86/hvm/vlapic.c +++ b/xen/arch/x86/hvm/vlapic.c @@ -240,7 +240,7 @@ static int vlapic_match_dest(struct vcpu *v, struct vlapic *source, if ( dest_mode == 0 ) { /* Physical mode. */ - if ( (dest == 0xFF) || (dest == v->vcpu_id) ) + if ( (dest == 0xFF) || (dest == VLAPIC_ID(target)) ) result = 1; } else @@ -900,7 +900,7 @@ static int vlapic_reset(struct vlapic *vlapic) struct vcpu *v = vlapic_vcpu(vlapic); int i; - vlapic_set_reg(vlapic, APIC_ID, v->vcpu_id << 24); + vlapic_set_reg(vlapic, APIC_ID, (v->vcpu_id + 1) << 24); vlapic_set_reg(vlapic, APIC_LVR, VLAPIC_VERSION); for ( i = 0; i < 8; i++ ) -- 2.30.2